package com.zpark.rabbit_mq.controller;

import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

/**
 * @PackageName: com.zpark.rabbit_mq.controller
 * @ClassName: TestRabbitMQController
 * @Description:
 * @author: RZS
 * @date: 2024/4/8  9:01
 */
@RestController
@RequestMapping("/mq")
public class TestRabbitMQController {

    // 自动注入RabbitTemplate
    @Autowired
    private RabbitTemplate rabbitTemplate;

    // 编写测试发送消息方法
    @RequestMapping("/send")
    public String sendDirectMessage(){
        // 消息ID
        String msgID = UUID.randomUUID().toString();
        // 消息内容
        String msg = "SpringBoot整合RabbitMQ";
        // 获取当前时间字符串
        String dateStr = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());

        // 将消息封装到map
        Map<String, String> map = new HashMap<>();
        map.put("msgID", msgID);
        map.put("msg", msg);
        map.put("dateStr", dateStr);

        // 调用方法发送消息
        /*
            将Java对象转换为Amqp消息，并使用特定的路由密钥将其发送到特定的交换机。
            参数：
                exchange—交换名称
                routingKey—路由密钥
                obj—发送的消息
                correlationData—关联发布者确认的数据。
         */
        rabbitTemplate.convertAndSend("TestDirectExchange", "123",
                map, new CorrelationData(UUID.randomUUID().toString()));

        return "OK";
    }

    @RequestMapping("/fanout")
    public String sendFanoutMessage(){
        // 消息ID
        String msgID = UUID.randomUUID().toString();
        // 消息内容
        String msg = "路由模式（Fanout），广播";
        // 获取当前时间字符串
        String dateStr = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());

        // 将消息封装到map
        Map<String, String> map = new HashMap<>();
        map.put("msgID", msgID);
        map.put("msg", msg);
        map.put("dateStr", dateStr);

        // 调用方法发送消息
        /*
            将Java对象转换为Amqp消息，并使用特定的路由密钥将其发送到特定的交换机。
            参数：
                exchange—交换名称
                routingKey—路由密钥
                obj—发送的消息
                correlationData—关联发布者确认的数据。
         */
        rabbitTemplate.convertAndSend("FanoutExchange", "123",
                map, new CorrelationData(UUID.randomUUID().toString()));

        return "OK";
    }

    @RequestMapping("/topic")
    public String sendTopicMessage(){
        // 调用方法发送消息
        rabbitTemplate.convertAndSend("TopicExchange", "test.topic.a",
                getMsg("A"), new CorrelationData(UUID.randomUUID().toString()));

        rabbitTemplate.convertAndSend("TopicExchange", "test.topic.b",
                getMsg("B"), new CorrelationData(UUID.randomUUID().toString()));

        rabbitTemplate.convertAndSend("TopicExchange", "test.topic.c",
                getMsg("C"), new CorrelationData(UUID.randomUUID().toString()));

        return "OK";
    }

    // 给队列A
    private Map<String, String> getMsg(String message){
        // 消息ID
        String msgID = UUID.randomUUID().toString();
        // 消息内容
        String msg = "Topic通配符匹配模式——" + message;
        // 获取当前时间字符串
        String dateStr = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());

        // 将消息封装到map
        Map<String, String> map = new HashMap<>();
        map.put("msgID", msgID);
        map.put("msg", msg);
        map.put("dateStr", dateStr);

        return map;
    }

}
